#include <gl/glut.h>  
static int spin = 0;  
void init()  
{  
	glShadeModel( GL_SMOOTH );  
	glEnable( GL_LIGHTING );  
	glEnable( GL_LIGHT0 );  
	glEnable( GL_DEPTH_TEST );  
}  
void display()  
{  
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );  
	GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };  
	glPushMatrix();  
	glTranslatef( 0.0, 0.0, -5.0 );  
	glPushMatrix();  
	glRotated( (GLdouble)spin, 1.0, 0.0, 0.0 );  
	glLightfv( GL_LIGHT0, GL_POSITION, position );  
	glTranslated( 0.0, 0.0, 1.5 );  
	glDisable( GL_LIGHTING );  
	glColor3f( 0.0, 1.0, 0.0 );  
	glutWireCube( 0.1 );//green cube, stand for the position of light
	glEnable( GL_LIGHTING );  
	glPopMatrix();  
	glutSolidSphere( 0.5, 40, 40 );//target object of light
	glPopMatrix();  
	glFlush();  
}  
void reshape( int w, int h )  
{  
	glViewport( 0, 0, (GLsizei)w, (GLsizei)h );  
	glMatrixMode( GL_PROJECTION );  
	glLoadIdentity();  
	gluPerspective( 40.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0 );  
	glMatrixMode( GL_MODELVIEW );  
	glLoadIdentity();  
}  
void mouse( int button, int state, int x, int y )  
{  
	switch ( button )  
	{  
	case GLUT_LEFT_BUTTON:  
		if ( state == GLUT_DOWN )  
		{  
			spin = ( spin + 30 ) % 360;  
			glutPostRedisplay();  
		}  
		break;  
	default:  
		break;  
	}  
}  
int main( int argc, char ** argv )  
{  
	glutInit( &argc, argv );  
	glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );  
	glutInitWindowPosition( 100, 100 );  
	glutInitWindowSize( 500, 500 );  
	glutCreateWindow( argv[0] );  
	init();  
	glutDisplayFunc( display );  
	glutReshapeFunc( reshape );  
	glutMouseFunc( mouse );  
	glutMainLoop();  
	return 0;  
}  